package com.pet_service.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.pet_service.entity.Role;
import com.pet_service.entity.User;
import com.pet_service.entity.UserRole;
import com.pet_service.enums.TUserRegisterTypeStatus;
import com.pet_service.enums.TUserStatus;
import com.pet_service.mapper.RoleMapper;
import com.pet_service.mapper.UserMapper;
import com.pet_service.mapper.UserRoleMapper;
import com.pet_service.result.Result;
import com.pet_service.service.StaffService;
import com.pet_service.vo.PageBean;
import com.pet_service.vo.PageResultVO;
import com.pet_service.vo.StaffFormDTO;
import com.pet_service.vo.StaffProfileVO;
import jakarta.annotation.Resource;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service
public class StaffServiceImpl implements StaffService {

    @Resource
    private UserMapper userMapper;
    // 查询服务人员角色
    @Resource
    private RoleMapper roleMapper;

    // 插入用户-角色关联
    @Resource
    private UserRoleMapper userRoleMapper;
    @Resource
    private BCryptPasswordEncoder passwordEncoder; // 注入加密器

    @Override
    public PageResultVO<StaffProfileVO> queryStaffProfiles(PageBean pageBean) {
        // 1. 查询当前页数据列表
        List<StaffProfileVO> staffList = userMapper.selectStaffProfiles(pageBean);

        // 2. 查询总记录数（用于计算总页数）
        Long total = userMapper.selectStaffProfilesCount(pageBean);

        // 3. 封装分页结果
        return new PageResultVO<>(total, staffList, pageBean);
    }

    // 根据ID查询单个服务人员档案
    @Override
    public StaffProfileVO queryStaffProfileById(Integer id) {
        return userMapper.selectStaffProfileById(id);
    }

    // 新增服务人员
    @Override
    @Transactional
    public Result addStaff(StaffFormDTO staffFormDTO) {
        // 1. 基础参数校验
        if (staffFormDTO.getUsername() == null || staffFormDTO.getUsername().trim().isEmpty()) {
            return Result.fail("用户名不能为空");
        }
        if (staffFormDTO.getPassword() == null || staffFormDTO.getPassword().trim().isEmpty()) {
            return Result.fail("密码不能为空");
        }
        if (staffFormDTO.getHospital_id() == null) {
            return Result.fail("所属医院ID不能为空");
        }

        // 2. 校验用户名唯一性
        if (userMapper.checkUserName(staffFormDTO.getUsername()) > 0) {
            return Result.fail("用户名已存在");
        }

        // 3. 密码加密
        String encryptedPassword = passwordEncoder.encode(staffFormDTO.getPassword());

        // 4. 构建User对象（存入加密密码、医院ID等）
        User user = new User();
        user.setUsername(staffFormDTO.getUsername());
        user.setPassword(encryptedPassword); // 存储加密后的密码
        user.setNickname(staffFormDTO.getNickname());
        user.setReal_name(staffFormDTO.getRealName());
        user.setPhone(staffFormDTO.getPhone());
        user.setAvatar_url(staffFormDTO.getAvatarUrl());
        user.setHospital_id(staffFormDTO.getHospital_id()); // 存入医院ID（外键）
        user.setStatus(TUserStatus.ACTIVE);
        user.setRegister_type(TUserRegisterTypeStatus.ACCOUNT_PASSWORD);
        user.setCreated_at(new Date());
        user.setUpdated_at(new Date());
        user.setIs_deleted(0);

        // 5. 插入user表
        int insertUserResult = userMapper.insert(user);
        if (insertUserResult <= 0) {
            return Result.fail("服务人员添加失败");
        }

        // 6. 关联“服务人员”角色（从role表查询角色ID）
        Role staffRole = roleMapper.selectOne(
                new QueryWrapper<Role>()
                        .eq("role_code", "STAFF") // 假设服务人员角色编码为"STAFF"
                        .eq("is_deleted", 0)
        );
        if (staffRole == null) {
            return Result.fail("系统中未配置“服务人员”角色，请先添加角色");
        }

        UserRole userRole = new UserRole();
        userRole.setUser_id(user.getId());
        userRole.setRole_id(staffRole.getId());
        userRole.setCreated_at(new Date());
        userRole.setUpdated_at(new Date());
        userRole.setIs_deleted(0);

        // 7. 插入用户-角色关联表
        int insertUserRoleResult = userRoleMapper.insert(userRole);
        if (insertUserRoleResult <= 0) {
            return Result.fail("服务人员角色关联失败");
        }

        return Result.ok("服务人员添加成功");
    }


    // 修改服务人员
    @Override
    @Transactional
    public Result updateStaff(StaffFormDTO staffFormDTO) {
        // 1. 参数校验
        if (staffFormDTO.getId() == null) {
            return Result.fail("服务人员ID不能为空");
        }

        // 2. 检查用户是否存在
        if (!userMapper.existsById(staffFormDTO.getId())) {
            return Result.fail("服务人员不存在");
        }

        // 3. 更新用户信息
        var user = new User();
        user.setId(staffFormDTO.getId());
        user.setUsername(staffFormDTO.getUsername());
        user.setNickname(staffFormDTO.getNickname());
        user.setReal_name(staffFormDTO.getRealName());
        user.setPhone(staffFormDTO.getPhone());
        user.setAvatar_url(staffFormDTO.getAvatarUrl());
        user.setHospital_id(staffFormDTO.getHospital_id());

        // 4. 如果提供了新密码，则更新密码
        // 修改后
        if (staffFormDTO.getPassword() != null && !staffFormDTO.getPassword().trim().isEmpty()) {
            // 加密后再存储
            user.setPassword(passwordEncoder.encode(staffFormDTO.getPassword()));
        }

        // 5. 执行更新
        int result = userMapper.updateById(user);
        if (result > 0) {
            return Result.ok("服务人员更新成功");
        } else {
            return Result.fail("服务人员更新失败");
        }
    }

    // 删除服务人员（逻辑删除）
    @Override
    @Transactional
    public Result deleteStaff(Integer id) {
        // 1. 参数校验
        if (id == null) {
            return Result.fail("服务人员ID不能为空");
        }

        // 2. 检查用户是否存在
        if (!userMapper.existsById(id)) {
            return Result.fail("服务人员不存在");
        }

        // 3. 逻辑删除（设置 is_deleted = 1）
        int result = userMapper.deleteById(id);
        if (result > 0) {
            return Result.ok("服务人员删除成功");
        } else {
            return Result.fail("服务人员删除失败");
        }
    }


}